package org.cybzacg.encryption.strategy;

import org.cybzacg.encryption.context.EncryptionContext;
import org.cybzacg.encryption.model.EncryptionResult;
import org.cybzacg.encryption.model.ValidationResult;
import org.cybzacg.encryption.enums.SecurityStrategyEnum;

/**
 * 安全策略接口
 * 定义不同安全级别的处理策略
 * 
 * @author encryption team
 * @version 1.0
 */
public interface SecurityStrategy {
    
    /**
     * 执行加密前的安全检查
     * 
     * @param data 待加密数据
     * @param context 加密上下文
     * @return 验证结果
     */
    ValidationResult validateBeforeEncryption(byte[] data, EncryptionContext context);
    
    /**
     * 执行解密前的安全检查
     * 
     * @param encryptedData 加密数据
     * @param context 解密上下文
     * @return 验证结果
     */
    ValidationResult validateBeforeDecryption(byte[] encryptedData, EncryptionContext context);
    
    /**
     * 处理加密结果
     * 
     * @param result 原始加密结果
     * @param context 加密上下文
     * @return 处理后的加密结果
     */
    EncryptionResult processEncryptionResult(EncryptionResult result, EncryptionContext context);
    
    /**
     * 处理解密结果
     * 
     * @param result 原始解密结果
     * @param context 解密上下文
     * @return 处理后的解密结果
     */
    EncryptionResult processDecryptionResult(EncryptionResult result, EncryptionContext context);
    
    /**
     * 处理异常情况
     * 
     * @param exception 异常
     * @param context 上下文
     * @return 处理后的异常，可能为null表示忽略异常
     */
    Exception handleException(Exception exception, EncryptionContext context);
    
    /**
     * 获取策略类型
     * 
     * @return 策略类型
     */
    SecurityStrategyEnum getStrategyType();
    
    /**
     * 获取策略描述
     * 
     * @return 策略描述
     */
    String getDescription();
    
    /**
     * 检查是否支持指定的上下文
     * 
     * @param context 加密上下文
     * @return 是否支持
     */
    boolean supports(EncryptionContext context);
    
    /**
     * 获取策略优先级
     * 数值越小优先级越高
     * 
     * @return 优先级值
     */
    int getPriority();
    
    /**
     * 初始化策略
     * 
     * @param context 初始化上下文
     */
    default void initialize(EncryptionContext context) {
        // 默认实现为空，子类可以重写
    }
    
    /**
     * 清理策略资源
     */
    default void cleanup() {
        // 默认实现为空，子类可以重写
    }
    
    /**
     * 检查是否需要记录日志
     * 
     * @param context 上下文
     * @return 是否需要记录日志
     */
    default boolean isLoggingEnabled(EncryptionContext context) {
        return true;
    }
    
    /**
     * 检查是否需要性能监控
     * 
     * @param context 上下文
     * @return 是否需要性能监控
     */
    default boolean isMonitoringEnabled(EncryptionContext context) {
        return true;
    }
    
    /**
     * 获取最大重试次数
     * 
     * @param context 上下文
     * @return 最大重试次数
     */
    default int getMaxRetries(EncryptionContext context) {
        return 3;
    }
    
    /**
     * 获取重试间隔（毫秒）
     * 
     * @param context 上下文
     * @return 重试间隔
     */
    default long getRetryInterval(EncryptionContext context) {
        return 1000;
    }
}
